package net.intellect.collectpro.util;

import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import org.apache.commons.collections.ListUtils;
import org.apache.log4j.Logger;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;

public class Util {

	
	public static String obtenerPeridoCompleto(int ciclo,String periodo) {				
		String cicloString = String.valueOf(ciclo);
		String periodoString = periodo;
		
		if (cicloString!=null && cicloString.length()<2) {
			for (int i=cicloString.length();i<2;i++) {
				cicloString="0" + cicloString;
			}			
		}
		if (periodoString!=null && periodoString.length()<2) {
			for (int i=periodoString.length();i<6;i++) {
				periodoString="0" + periodoString;
			}			
		}
		
		return periodoString+cicloString;	
	}
	
	
	public static String obtenerCicloCobroStr(String periodoCompleto) {
		return periodoCompleto.substring(6,8);
	}	
	
	public static int obtenerCicloCobro(String periodoCompleto) {
		if (periodoCompleto!=null && periodoCompleto.length()<8) {
			for (int i=periodoCompleto.length();i<8;i++) {
				periodoCompleto="0" + periodoCompleto;
			}			
		}
		return Integer.parseInt(periodoCompleto.substring(6,8));
	}
	
	public static String obtenerMesCobro(String periodoCompleto) {
		return periodoCompleto.substring(0,2);
	}
	
	public static String obtenerAnoCobro(String periodoCompleto) {
		return periodoCompleto.substring(2,6);
	}			
	
	public static String obtenerMesAnoCobro(String periodoCompleto) {
		return periodoCompleto.substring(0,6);
	}				
	
	/**
	 * Obtiene el periodo de cobro anterior
	 * @param periodoDeCobro
	 * @return
	 */
	public static String obtenerPeriodoAnterior(String periodoDeCobro) {
		int mes = Integer.parseInt(periodoDeCobro.substring(0,2));
		int anno = Integer.parseInt(periodoDeCobro.substring(2,6));
		
		String mesPeriodoAnterior = new String();
		String annoPeriodoAnterior = new String();
		
		if (mes==1) {
			//Mes 12 del ano anterior
			mesPeriodoAnterior = "12";
			annoPeriodoAnterior = String.valueOf(anno-1);
		} else {
			annoPeriodoAnterior = String.valueOf(anno);
			mesPeriodoAnterior = String.valueOf(mes-1);
			if (mesPeriodoAnterior.length()==1) {
				mesPeriodoAnterior="0"+mesPeriodoAnterior;
			}
		}
		
		return mesPeriodoAnterior+annoPeriodoAnterior;
	}

	
	/**
	 * Obtiene el siguiente dia habil de cobro.
	 * Los dias habiles son de lunes a sabado
	 * @param fecha1
	 * @return
	 */
	public static Date obtenerSiguienteDiaHabil(Date fecha1,List<Date> feriados) {
		Calendar calendario = Calendar.getInstance();
		calendario.setTimeInMillis(fecha1.getTime());
		calendario.set(Calendar.HOUR_OF_DAY, 0);
		calendario.set(Calendar.MINUTE , 0);
		calendario.set(Calendar.SECOND , 0);		
		boolean done = false;
		
		while(!done) {
			calendario.add(Calendar.DATE, 1);
			
			
			//Si no es domingo ni feriado esta listo.
			if (calendario.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY && !esFeriado(calendario.getTime(),feriados)) {
				done=true;					
			}
		}
		return calendario.getTime();
	}
	
	/**
	 * Obtiene el siguiente dia calendario
	 * @param fecha1
	 * @return
	 */
	public static Date obtenerSiguienteDiaCal(Date fecha1) {
		Calendar calendario = Calendar.getInstance();
		calendario.setTimeInMillis(fecha1.getTime());
		calendario.add(Calendar.DATE, 1);		
		return calendario.getTime();
	}
	
	public static Date obtenerFechaSinHora(Date fecha1) {
		Calendar calendario = Calendar.getInstance();
		calendario.setTimeInMillis(fecha1.getTime());
		calendario.set(Calendar.HOUR_OF_DAY,0);
		calendario.set(Calendar.MINUTE,0);
		calendario.set(Calendar.SECOND,0);
		calendario.set(Calendar.MILLISECOND,0);
		return calendario.getTime();
	}	
	
	public static boolean esFeriado(Date fecha1,List<Date> feriados) {
		Calendar calendario = Calendar.getInstance();		
		calendario.setTimeInMillis(fecha1.getTime());
		calendario.set(Calendar.HOUR_OF_DAY, 0);
		calendario.set(Calendar.MINUTE , 0);
		calendario.set(Calendar.SECOND , 0);
		calendario.set(Calendar.MILLISECOND,0);
		
		List<Date> fechasTemp = new ArrayList<Date>();
		fechasTemp.add(calendario.getTime());
		
		fechasTemp = ListUtils.intersection(fechasTemp, feriados);
		if (fechasTemp!=null && fechasTemp.size()>0 ) {
			return true;
		}
		return false;
	}	
	
	/**
	 * Devuelve true si es domingo
	 * @param fecha1
	 * @return
	 */
	public static boolean esDomingo(Date fecha1) {
		Calendar calendario = Calendar.getInstance();
		calendario.setTimeInMillis(fecha1.getTime());
		if (calendario.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
			return true;
		}
		return false;
	}	
	
	/**
	 * Devuelve true si es sabado
	 * @param fecha1
	 * @return
	 */
	public static boolean esSabado(Date fecha1) {
		Calendar calendario = Calendar.getInstance();
		calendario.setTimeInMillis(fecha1.getTime());
		if (calendario.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY) {
			return true;
		}
		return false;
	}	
	
	
	public static HSSFFont obtenerFuenteTitulo1(HSSFWorkbook objWB) {
		HSSFFont fuente = objWB.createFont();
		fuente.setFontHeightInPoints((short)20);
		fuente.setFontName(HSSFFont.FONT_ARIAL);
		fuente.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
		fuente.setColor(HSSFColor.BLUE.index);
		return fuente;
	}
	
	public static HSSFFont obtenerFuenteTitulo2(HSSFWorkbook objWB) {
		HSSFFont fuente = objWB.createFont();
		fuente.setFontHeightInPoints((short)12);
		fuente.setFontName(HSSFFont.FONT_ARIAL);
		fuente.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
		fuente.setColor(HSSFColor.BLUE.index);		
		return fuente;
	}
	
	public static HSSFFont obtenerFuenteTitulo3(HSSFWorkbook objWB) {
		HSSFFont fuente = objWB.createFont();
		fuente.setFontHeightInPoints((short)10);
		fuente.setFontName(HSSFFont.FONT_ARIAL);
		fuente.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
		fuente.setColor(HSSFColor.BLUE.index);
		return fuente;
	}
	
	public static HSSFFont obtenerFuenteTexto(HSSFWorkbook objWB) {
		HSSFFont fuente = objWB.createFont();
		fuente.setFontHeightInPoints((short)8);
		fuente.setFontName(HSSFFont.FONT_ARIAL);
		fuente.setColor(HSSFColor.BLUE.index);
		return fuente;
	}	
	
	public static HSSFCellStyle obtenerEstiloCelda(HSSFWorkbook objWB, boolean wrapText, short align,HSSFFont fuente) {
		HSSFCellStyle estiloCelda = objWB.createCellStyle();
		estiloCelda.setWrapText(wrapText);
		estiloCelda.setAlignment(align);
		estiloCelda.setFont(fuente);
		
		estiloCelda.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
		estiloCelda.setFillForegroundColor(HSSFColor.LAVENDER.index);
		return estiloCelda;
	}

	public static HSSFCellStyle obtenerEstiloCelda(HSSFWorkbook objWB, boolean wrapText, short align,HSSFFont fuente,boolean esTitulo) {
		HSSFCellStyle estiloCelda = Util.obtenerEstiloCelda(objWB, wrapText, align, fuente);		
		if (esTitulo) {
			estiloCelda.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
			estiloCelda.setFillForegroundColor(HSSFColor.GREY_40_PERCENT.index);
		}
		return estiloCelda;
	}
	
	public static HSSFCellStyle obtenerEstiloCelda(HSSFWorkbook objWB, boolean wrapText, short align,HSSFFont fuente,boolean esTitulo,boolean esSubTitulo) {
		HSSFCellStyle estiloCelda = Util.obtenerEstiloCelda(objWB, wrapText, align, fuente);		
		if (esTitulo) {
			estiloCelda.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
			estiloCelda.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index);
		}
		return estiloCelda;
	}	
	
	public static HSSFCellStyle obtenerEstiloPorcentaje(HSSFWorkbook objWB, boolean wrapText, short align,HSSFFont fuente) {
		HSSFCellStyle estiloPorcentaje = objWB.createCellStyle();		
		estiloPorcentaje.setWrapText(wrapText);
		estiloPorcentaje.setAlignment(align);
		estiloPorcentaje.setFont(fuente);
		estiloPorcentaje.setDataFormat(HSSFDataFormat.getBuiltinFormat("0.00%"));

		estiloPorcentaje.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
		estiloPorcentaje.setFillForegroundColor(HSSFColor.LAVENDER.index);		
		
		return estiloPorcentaje;

	}
	
	public static HSSFCellStyle obtenerEstiloPorcentaje(HSSFWorkbook objWB, boolean wrapText, short align,HSSFFont fuente,boolean esTitulo) {
		HSSFCellStyle estiloPorcentaje = Util.obtenerEstiloPorcentaje(objWB, wrapText, align, fuente);
		if (esTitulo) {
			estiloPorcentaje.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
			estiloPorcentaje.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index);
		}
		return estiloPorcentaje;

	}
	
	public static String obtenerColumnaFilaExcel(int row,int cellNum) {
		char[] A2Z = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S'
		,'T','U','V','W','X','Y','Z'};
		
		StringBuffer retval = new StringBuffer();
        int tempcellnum = cellNum;
        do {
            retval.insert(0, A2Z[tempcellnum%26]);
            tempcellnum = (tempcellnum / 26) - 1;
        } while (tempcellnum >= 0);
        retval.append(row+1);
        return retval.toString();			
	}

	
	public static void escribirEncabezadoLog(Logger log,String message) throws Exception {
		log.info(" ");
		log.info(" ");
		log.info(" ");
		log.info(message.toUpperCase());
	}
	
	public static String obtenerNombreMes(int mes) throws Exception {
		switch (mes) {
		case 1: return "Enero";
		case 2: return "Febrero";
		case 3: return "Marzo";
		case 4: return "Abril";
		case 5: return "Mayo";
		case 6: return "Junio";
		case 7: return "Julio";
		case 8: return "Agosto";
		case 9: return "Setiembre";
		case 10: return "Octubre";
		case 11: return "Noviembre";
		case 12: return "Diciembre";
		default: return "---";
		}
	}	
	
	public static int obtenerSigMes(int mes) throws Exception {
		if (mes<11) return mes+1;
		else return 1;
	}
	
	
	public static String completarString(String cadena,int numCaracteres) throws Exception {
		if (cadena == null) cadena = new String();
		if (cadena.length()>numCaracteres) {
			return cadena.substring(0,numCaracteres);
		} else {
			for (int i=cadena.length();i<numCaracteres;i++) {
				cadena=" " + cadena;
			}
		}
		return cadena;
	}
	
	public static String completarStringDerecha(String cadena,int numCaracteres) throws Exception {
		if (cadena == null) cadena = new String();
		if (cadena.length()>numCaracteres) {
			return cadena.substring(0,numCaracteres);
		} else {
			for (int i=cadena.length();i<numCaracteres;i++) {
				cadena+=" ";
			}
		}
		return cadena;
	}	
	
	public static String formatearNum(double numero,int numEnteros,int numDecimales) throws Exception{
		String pattern = "###############0";
		
		if (numDecimales>0) {
			pattern+=".";
		}
		for (int i=0;i<numDecimales;i++) {
			pattern+="0";
		}		
		
		DecimalFormat formato = new DecimalFormat(pattern);
		int numCaracteres = numEnteros;
		if (numDecimales>0) {	
			numCaracteres++;
			numCaracteres += numDecimales;
		
		}
		return completarString(formato.format(numero),numCaracteres);
	}
	
	public static Date sumarDiasFecha(Date fecha1,int numDias) {
		Calendar calendario = Calendar.getInstance();
		calendario.setTimeInMillis(fecha1.getTime());
		calendario.add(Calendar.DATE, numDias);		
		return calendario.getTime();
	}		
	
	
	public static Date parsearStringDate(String fecha) throws Exception {
		SimpleDateFormat f = new SimpleDateFormat("dd/MM/yyyy");
        return f.parse(fecha);			
	}
	
	public static String parsearDateString(Date fecha) throws Exception {
		SimpleDateFormat f = new SimpleDateFormat("dd-MM-yyyy");		
        return f.format(fecha);			
	}
	
	public static String parsearDateTimeString(Date fecha) throws Exception {
		SimpleDateFormat f = new SimpleDateFormat("dd/MM/yyyy HH:mm");		
        return f.format(fecha);			
	}	
	
	public static String formatearFechaNormal(Date fecha) throws Exception {
		if (fecha==null) return "NULL";
		SimpleDateFormat f = new SimpleDateFormat("dd/MM/yyyy");		
        return f.format(fecha);			
	}	
	
	public static String formatearFechaHoraNormal(Date fecha) throws Exception {
		if (fecha==null) return "NULL";
		SimpleDateFormat f = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");		
        return f.format(fecha);			
	}
	
	public static int obtenerNumLlamada(String nameLlamada) throws Exception {
		int numLlamada = 0;
		try {
			if (nameLlamada!=null) {		
				int index = nameLlamada.lastIndexOf('-');						
			
				if (index>-1 && index < nameLlamada.length()-1) {				
					numLlamada = Integer.valueOf(nameLlamada.substring(index+1));
				} 
			}
			
		} catch (Exception e) {
			return 0;
		}	
		return numLlamada;
	}		
	
}
